home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / ds3100.md / devDC7085.c < prev    next >
Text File  |  1992-12-18  |  23KB  |  931 lines

  1. /* 
  2.  *  devDC7085.c --
  3.  *
  4.  *         This file contains machine-dependent routines that handle the
  5.  *    output queue for the serial lines.
  6.  *
  7.  *    Copyright (C) 1989 Digital Equipment Corporation.
  8.  *    Permission to use, copy, modify, and distribute this software and
  9.  *    its documentation for any purpose and without fee is hereby granted,
  10.  *    provided that the above copyright notice appears in all copies.  
  11.  *    Digital Equipment Corporation makes no representations about the
  12.  *    suitability of this software for any purpose.  It is provided "as is"
  13.  *    without express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/ds3100.md/devDC7085.c,v 9.1 91/08/19 13:50:20 jhh Exp $ SPRITE (DECWRL)";
  18. #endif not lint
  19.  
  20. #include "sprite.h"
  21. #include "machMon.h"
  22. #include "mach.h"
  23. #include "dev.h"
  24. #include "fs.h"
  25. #include "sys.h"
  26. #include "sync.h"
  27. #include "timer.h"
  28. #include "dbg.h"
  29. #include "dc7085.h"
  30. #include "graphics.h"
  31. #include "machAddrs.h"
  32. #include "console.h"
  33. #include <sgtty.h>
  34.  
  35. static Sync_Semaphore dc7085Mutex = Sync_SemInitStatic("Dev:dc7085Mutex");
  36.  
  37. /*
  38.  * Define the six registers.
  39.  */
  40. #define REG_ADDR(offset) (unsigned short *)(MACH_SERIAL_INTERFACE_ADDR + (offset))
  41. static volatile unsigned short *csrPtr =  REG_ADDR(0x00);
  42. static volatile unsigned short *rBufPtr = REG_ADDR(0x08);
  43. static volatile unsigned short *lprPtr =  REG_ADDR(0x08);
  44. static volatile unsigned short *tcrPtr =  REG_ADDR(0x10);
  45. #ifndef lint
  46. static volatile unsigned short *msrPtr =  REG_ADDR(0x18);
  47. #endif
  48. static volatile unsigned short *tdrPtr =  REG_ADDR(0x18);
  49.  
  50. /*
  51.  * The current status of the break bits.
  52.  */
  53. unsigned breakVal = 0;
  54.  
  55. /*
  56.  * Tables mapping sgttyb baud-rate values to actual integers and lpr register
  57.  * values.
  58.  */
  59. static struct {
  60.     int regVal;                /* Value to set in lpr register. */
  61.     int sgttybVal;            /* Baud value from sgtyb. */
  62.     int baud;                /* Integer baud rate. */
  63. } baudMap[] = {
  64.     {0, 0, 0},
  65.     {LPR_B50, B50, 50},
  66.     {LPR_B75, B75, 75},
  67.     {LPR_B110, B110, 110},
  68.     {LPR_B134, B134, 134},
  69.     {LPR_B150, B150, 150},
  70.     {-1, B200, 200},
  71.     {LPR_B300, B300, 300},
  72.     {LPR_B600, B600, 600},
  73.     {LPR_B1200, B1200, 1200},
  74.     {LPR_B2400, B2400, 2400},
  75.     {LPR_B4800, B4800, 4800},
  76.     {LPR_B9600, B9600, 9600}, 
  77.     {-1, -1, -1}
  78. };
  79.  
  80. /*
  81.  * Ascii values of command keys.
  82.  */
  83. #define KBD_TAB        '\t'
  84. #define KBD_DEL        127
  85. #define KBD_RET        '\r'
  86.  
  87. /*
  88.  *  Define "hardware-independent" codes for the control, shift, meta and 
  89.  *  function keys.  Codes start after the last 7-bit ASCII code (127)
  90.  *  and are assigned in an arbitrary order.
  91.  */
  92. #define KBD_NOKEY    128
  93. #define KBD_UNKNOWN    129
  94.  
  95. #define KBD_F1        201
  96. #define KBD_F2        202
  97. #define KBD_F3        203
  98. #define KBD_F4        204
  99. #define KBD_F5        205
  100. #define KBD_F6        206
  101. #define KBD_F7        207
  102. #define KBD_F8        208
  103. #define KBD_F9        209
  104. #define KBD_F10        210
  105. #define KBD_F11        211
  106. #define KBD_F12        212
  107. #define KBD_F13        213
  108. #define KBD_F14        214
  109. #define KBD_HELP    215
  110. #define KBD_DO        216
  111. #define KBD_F17        217
  112. #define KBD_F18        218
  113. #define KBD_F19        219
  114. #define KBD_F20        220
  115.  
  116. #define KBD_FIND    221
  117. #define KBD_INSERT    222
  118. #define KBD_REMOVE    223
  119. #define KBD_SELECT    224
  120. #define KBD_PREVIOUS    225
  121. #define KBD_NEXT    226
  122.  
  123. #define KBD_KP_ENTER    227
  124. #define KBD_KP_F1    228
  125. #define KBD_KP_F2    229
  126. #define KBD_KP_F3    230
  127. #define KBD_KP_F4    231
  128. #define KBD_LEFT    232
  129. #define KBD_RIGHT    233
  130. #define KBD_DOWN    234
  131. #define KBD_UP        235
  132.  
  133. #define KBD_CONTROL    236
  134. #define KBD_SHIFT    237
  135. #define KBD_CAPSLOCK    238
  136. #define KBD_ALTERNATE    239
  137.  
  138. #define KBD_MAX_VALUE    KBD_ALTERNATE
  139.  
  140. /*
  141.  * Keyboard to Ascii, unshifted. 
  142.  */
  143. static unsigned char unshiftedAscii[] = {
  144. /*  0 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  145. /*  4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  146. /*  8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  147. /*  c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  148. /* 10 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  149. /* 14 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  150. /* 18 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  151. /* 1c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  152. /* 20 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  153. /* 24 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  154. /* 28 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  155. /* 2c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  156. /* 30 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  157. /* 34 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  158. /* 38 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  159. /* 3c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  160. /* 40 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  161. /* 44 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  162. /* 48 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  163. /* 4c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  164. /* 50 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  165. /* 54 */ KBD_NOKEY,    KBD_NOKEY,    KBD_F1,        KBD_F2,
  166. /* 58 */ KBD_F3,    KBD_F4,        KBD_F5,        KBD_NOKEY,
  167. /* 5c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  168. /* 60 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  169. /* 64 */ KBD_F6,    KBD_F7,        KBD_F8,        KBD_F9,
  170. /* 68 */ KBD_F10,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  171. /* 6c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  172. /* 70 */ KBD_NOKEY,    KBD_F11,    KBD_F12,    KBD_F13,
  173. /* 74 */ KBD_F14,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  174. /* 78 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  175. /* 7c */ KBD_HELP,    KBD_DO,        KBD_NOKEY,    KBD_NOKEY,
  176. /* 80 */ KBD_F17,    KBD_F18,    KBD_F19,    KBD_F20,
  177. /* 84 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  178. /* 88 */ KBD_NOKEY,    KBD_NOKEY,    KBD_FIND,    KBD_INSERT,
  179. /* 8c */ KBD_REMOVE,    KBD_SELECT,    KBD_PREVIOUS,    KBD_NEXT,
  180. /* 90 */ KBD_NOKEY,    KBD_NOKEY,    '0',        KBD_NOKEY,
  181. /* 94 */ '.',        KBD_KP_ENTER,    '1',        '2',
  182. /* 98 */ '3',        '4',        '5',        '6',
  183. /* 9c */ ',',        '7',        '8',        '9',
  184. /* a0 */ '-',        KBD_KP_F1,    KBD_KP_F2,    KBD_KP_F3,
  185. /* a4 */ KBD_KP_F4,    KBD_NOKEY,    KBD_NOKEY,    KBD_LEFT,
  186. /* a8 */ KBD_RIGHT,    KBD_DOWN,     KBD_UP,        KBD_NOKEY,
  187. /* ac */ KBD_NOKEY,    KBD_NOKEY,    KBD_SHIFT,    KBD_CONTROL,
  188. /* b0 */ KBD_CAPSLOCK,    KBD_ALTERNATE,    KBD_NOKEY,    KBD_NOKEY,
  189. /* b4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  190. /* b8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  191. /* bc */ KBD_DEL,    KBD_RET,    KBD_TAB,    '`',
  192. /* c0 */ '1',        'q',        'a',        'z',
  193. /* c4 */ KBD_NOKEY,    '2',        'w',        's',
  194. /* c8 */ 'x',        '<',        KBD_NOKEY,    '3',
  195. /* cc */ 'e',        'd',        'c',        KBD_NOKEY,
  196. /* d0 */ '4',        'r',        'f',        'v',
  197. /* d4 */ ' ',        KBD_NOKEY,    '5',        't',
  198. /* d8 */ 'g',        'b',        KBD_NOKEY,    '6',
  199. /* dc */ 'y',        'h',        'n',        KBD_NOKEY,
  200. /* e0 */ '7',        'u',        'j',        'm',
  201. /* e4 */ KBD_NOKEY,    '8',        'i',        'k',
  202. /* e8 */ ',',        KBD_NOKEY,    '9',        'o',
  203. /* ec */ 'l',        '.',        KBD_NOKEY,    '0',
  204. /* f0 */ 'p',        KBD_NOKEY,    ';',        '/',
  205. /* f4 */ KBD_NOKEY,    '=',        ']',        '\\',
  206. /* f8 */ KBD_NOKEY,    '-',        '[',        '\'',
  207. /* fc */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  208. };
  209.  
  210. /*
  211.  * Keyboard to Ascii, shifted.
  212.  */
  213. static unsigned char shiftedAscii[] = {
  214. /*  0 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  215. /*  4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  216. /*  8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  217. /*  c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  218. /* 10 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  219. /* 14 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  220. /* 18 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  221. /* 1c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  222. /* 20 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  223. /* 24 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  224. /* 28 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  225. /* 2c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  226. /* 30 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  227. /* 34 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  228. /* 38 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  229. /* 3c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  230. /* 40 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  231. /* 44 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  232. /* 48 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  233. /* 4c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  234. /* 50 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  235. /* 54 */ KBD_NOKEY,    KBD_NOKEY,    KBD_F1,        KBD_F2,
  236. /* 58 */ KBD_F3,    KBD_F4,        KBD_F5,        KBD_NOKEY,
  237. /* 5c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  238. /* 60 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  239. /* 64 */ KBD_F6,    KBD_F7,        KBD_F8,        KBD_F9,
  240. /* 68 */ KBD_F10,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  241. /* 6c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  242. /* 70 */ KBD_NOKEY,    KBD_F11,    KBD_F12,    KBD_F13,
  243. /* 74 */ KBD_F14,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  244. /* 78 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  245. /* 7c */ KBD_HELP,    KBD_DO,        KBD_NOKEY,    KBD_NOKEY,
  246. /* 80 */ KBD_F17,    KBD_F18,    KBD_F19,    KBD_F20,
  247. /* 84 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  248. /* 88 */ KBD_NOKEY,    KBD_NOKEY,    KBD_FIND,    KBD_INSERT,
  249. /* 8c */ KBD_REMOVE,    KBD_SELECT,    KBD_PREVIOUS,    KBD_NEXT,
  250. /* 90 */ KBD_NOKEY,    KBD_NOKEY,    '0',        KBD_NOKEY,
  251. /* 94 */ '.',        KBD_KP_ENTER,    '1',        '2',
  252. /* 98 */ '3',        '4',        '5',        '6',
  253. /* 9c */ ',',        '7',        '8',        '9',
  254. /* a0 */ '-',        KBD_KP_F1,    KBD_KP_F2,    KBD_KP_F3,
  255. /* a4 */ KBD_KP_F4,    KBD_NOKEY,    KBD_NOKEY,    KBD_LEFT,
  256. /* a8 */ KBD_RIGHT,    KBD_DOWN,     KBD_UP,        KBD_NOKEY,
  257. /* ac */ KBD_NOKEY,    KBD_NOKEY,    KBD_SHIFT,    KBD_CONTROL,
  258. /* b0 */ KBD_CAPSLOCK,    KBD_ALTERNATE,    KBD_NOKEY,    KBD_NOKEY,
  259. /* b4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  260. /* b8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  261. /* bc */ KBD_DEL,    KBD_RET,    KBD_TAB,    '~',
  262. /* c0 */ '!',        'q',        'a',        'z',
  263. /* c4 */ KBD_NOKEY,    '@',        'w',        's',
  264. /* c8 */ 'x',        '>',        KBD_NOKEY,    '#',
  265. /* cc */ 'e',        'd',        'c',        KBD_NOKEY,
  266. /* d0 */ '$',        'r',        'f',        'v',
  267. /* d4 */ ' ',        KBD_NOKEY,    '%',        't',
  268. /* d8 */ 'g',        'b',        KBD_NOKEY,    '^',
  269. /* dc */ 'y',        'h',        'n',        KBD_NOKEY,
  270. /* e0 */ '&',        'u',        'j',        'm',
  271. /* e4 */ KBD_NOKEY,    '*',        'i',        'k',
  272. /* e8 */ ',',        KBD_NOKEY,    '(',        'o',
  273. /* ec */ 'l',        '.',        KBD_NOKEY,    ')',
  274. /* f0 */ 'p',        KBD_NOKEY,    ':',        '?',
  275. /* f4 */ KBD_NOKEY,    '+',        '}',        '|',
  276. /* f8 */ KBD_NOKEY,    '_',        '{',        '"',
  277. /* fc */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  278. };
  279.  
  280.  
  281. /*
  282.  * ----------------------------------------------------------------------------
  283.  *
  284.  * DevDC7085Reset --
  285.  *
  286.  *    Reset the chip.
  287.  *
  288.  * Results:
  289.  *    None.
  290.  *
  291.  * Side effects:
  292.  *    None.
  293.  *
  294.  * ----------------------------------------------------------------------------
  295.  */
  296. void
  297. DevDC7085Reset()
  298. {
  299.     *csrPtr = CSR_CLR;
  300.     while ((*csrPtr & CSR_CLR) != 0) {
  301.     }
  302.     *csrPtr = CSR_MSE | CSR_TIE | CSR_RIE;
  303. }
  304.  
  305. static void RecvIntr(), XmitIntr();
  306.  
  307. /*
  308.  * ----------------------------------------------------------------------------
  309.  *
  310.  * Dev_DC7085Interrupt --
  311.  *
  312.  *    Service an interrupt from the uart.
  313.  *
  314.  * Results:
  315.  *    None.
  316.  *
  317.  * Side effects:
  318.  *    Adds serial, keyboard or mouse events to the queue.
  319.  *
  320.  * ----------------------------------------------------------------------------
  321.  */
  322. ENTRY void
  323. Dev_DC7085Interrupt()
  324. {
  325.     MASTER_LOCK(&dc7085Mutex);
  326.  
  327.     if (*csrPtr & CSR_RDONE) {
  328.     RecvIntr();
  329.     }
  330.  
  331.     if (*csrPtr & CSR_TRDY) {
  332.     XmitIntr();
  333.     }
  334.  
  335.     MASTER_UNLOCK(&dc7085Mutex);
  336. }
  337.  
  338. static Boolean    shiftDown = FALSE;
  339. static Boolean    ctrlDown = FALSE;
  340. static Boolean    consoleCmd = FALSE;
  341. static unsigned char lastChar = 0;
  342. static Time    consoleCmdTime;
  343.  
  344.  
  345. /*
  346.  *----------------------------------------------------------------------
  347.  *
  348.  * RecvIntr --
  349.  *
  350.  *    Process a received character.
  351.  *
  352.  * Results:
  353.  *    None.
  354.  *
  355.  * Side effects:
  356.  *    Events added to the queue.
  357.  *
  358.  *----------------------------------------------------------------------
  359.  */
  360. ENTRY static void
  361. RecvIntr()
  362. {
  363.     unsigned short    recvBuf;
  364.     unsigned char    ch;
  365.     int            asciiChar;
  366.  
  367.     while (*csrPtr & CSR_RDONE) {
  368.     recvBuf = *rBufPtr;
  369.     ch = recvBuf & 0xFF;
  370.  
  371.     switch ((recvBuf & RBUF_LINE_NUM) >> RBUF_LINE_NUM_SHIFT) {
  372.         case KBD_PORT: {
  373.         if (devGraphicsOpen && !devDivertXInput) {
  374.             MASTER_UNLOCK(&dc7085Mutex);
  375.             DevGraphicsKbdIntr(ch);
  376.             MASTER_LOCK(&dc7085Mutex);
  377.             break;
  378.         }
  379.         if (ch != KEY_REPEAT) {
  380.             if (ch == KEY_UP) {
  381.             shiftDown = FALSE;
  382.             ctrlDown = FALSE;
  383.             break;
  384.             } else {
  385.             if (ch == KEY_SHIFT) {
  386.                 shiftDown = TRUE;
  387.                 break;
  388.             } else if (ch == KEY_CONTROL) {
  389.                 ctrlDown = TRUE;
  390.                 break;
  391.             } else if (ch == KEY_COMMAND) {
  392.                 consoleCmd = TRUE;
  393.                 Timer_GetTimeOfDay(&consoleCmdTime, (int *)NIL,
  394.                            (Boolean *)NIL);
  395.                 break;
  396.             }
  397.             }
  398.             lastChar = ch;
  399.         } else {
  400.             ch = lastChar;
  401.         }
  402.  
  403.         asciiChar = (int) DevDC7085TranslateKey(ch, shiftDown, 
  404.                     ctrlDown);
  405.         if (asciiChar != -1) {
  406.             if (consoleCmd) {
  407.             Time curTime, diff;
  408.  
  409.             consoleCmd = FALSE;
  410.             Timer_GetTimeOfDay(&curTime, (int *)NIL,(Boolean *)NIL);
  411.             Time_Subtract(curTime, consoleCmdTime, &diff);
  412.             if (diff.seconds <= CONSOLE_CMD_INTERVAL) {
  413.                 Dev_InvokeConsoleCmd(asciiChar);
  414.             } else {
  415.                 (*devKeyboard.inputProc)(devKeyboard.inputData, 
  416.                              asciiChar);
  417.             }
  418.             } else {
  419.             (*devKeyboard.inputProc)(devKeyboard.inputData, 
  420.                          asciiChar);
  421.             }
  422.         }
  423.         break;
  424.         }
  425.         case MOUSE_PORT:
  426.         if (devGraphicsOpen && !devDivertXInput) {
  427.             MASTER_UNLOCK(&dc7085Mutex);
  428.             DevGraphicsMouseIntr(ch);
  429.             MASTER_LOCK(&dc7085Mutex);
  430.         }
  431.         break;
  432.         case MODEM_PORT:
  433.         (*devSerialA.inputProc)(devSerialA.inputData, ch);
  434.         break;
  435.         case PRINTER_PORT:
  436.         (*devSerialB.inputProc)(devSerialB.inputData, ch);
  437.         break;
  438.     }
  439.     }
  440. }
  441.  
  442.  
  443. /*
  444.  *----------------------------------------------------------------------
  445.  *
  446.  * DevDC7085TranslateKey --
  447.  *
  448.  *    Translate a key code to an ascii character.
  449.  *
  450.  * Results:
  451.  *    The ascii character, -1 if couldn't translate it.
  452.  *
  453.  * Side effects:
  454.  *    None.
  455.  *
  456.  *----------------------------------------------------------------------
  457.  */
  458. char 
  459. DevDC7085TranslateKey(ch, shiftDown, ctrlDown)
  460.     unsigned char    ch;
  461.     Boolean    shiftDown;
  462.     Boolean    ctrlDown;
  463. {
  464.     char asciiChar;
  465.  
  466.     if (shiftDown) {
  467.     asciiChar = shiftedAscii[ch];
  468.     } else {
  469.     asciiChar = unshiftedAscii[ch];
  470.     }
  471.     if (asciiChar >= KBD_NOKEY) {
  472.     /*
  473.      * A function key was typed - ignore it.
  474.      */
  475.     return(-1);
  476.     } else if (asciiChar > KBD_MAX_VALUE) {
  477.     printf("DevDC7085TranslateKey: Bad key code raw: %d, mapped: %d\n",
  478.             ch, asciiChar);
  479.     return(-1);
  480.     } else {
  481.     if (asciiChar >= 'a' && asciiChar <= 'z') {
  482.         if (ctrlDown) {
  483.         asciiChar = asciiChar - 'a' + '';
  484.         } else if (shiftDown) {
  485.         asciiChar = asciiChar - 'a' + 'A';
  486.         }
  487.     } else if (ctrlDown) {
  488.         if (asciiChar >= '[' && asciiChar <= '_') {
  489.         asciiChar = asciiChar - '@';
  490.         } else if (asciiChar == ' ' || asciiChar == '@') {
  491.         asciiChar = '\0'; 
  492.         }
  493.     }
  494.     }
  495.  
  496.     return(asciiChar);
  497. }
  498.  
  499.  
  500. /*
  501.  *----------------------------------------------------------------------
  502.  *
  503.  * XmitIntr --
  504.  *
  505.  *    Handle a transmission interrupt.
  506.  *
  507.  * Results:
  508.  *    None.
  509.  *
  510.  * Side effects:
  511.  *    None.
  512.  *
  513.  *----------------------------------------------------------------------
  514.  */
  515. static void
  516. XmitIntr()
  517. {
  518.     int c;
  519.     int lineNum;
  520.  
  521.     if (!(*csrPtr & CSR_TRDY)) {
  522.     printf("XmitIntr: Spurious interrupt\n");
  523.     return;
  524.     }
  525.     lineNum = *csrPtr >> 8;
  526.     switch (lineNum & 0x3) {
  527.     case KBD_PORT:
  528.         break;
  529.     case MODEM_PORT:
  530.         c = (int) (*devSerialA.outputProc)(devSerialA.outputData);
  531.         if (c == -1) {
  532.         *tcrPtr &= ~(1 << MODEM_PORT);
  533.         devSerialA.flags &= ~XMIT_ENABLED;
  534.         } else {
  535.         *tdrPtr = breakVal | c;
  536.         }
  537.         break;
  538.     case PRINTER_PORT:
  539.         c = (int) (*devSerialB.outputProc)(devSerialB.outputData);
  540.         if (c == -1) {
  541.         *tcrPtr &= ~(1 << PRINTER_PORT);
  542.         devSerialB.flags &= ~XMIT_ENABLED;
  543.         } else {
  544.         *tdrPtr = breakVal | c;
  545.         }
  546.         break;
  547.     }
  548. }
  549.  
  550.  
  551. /*
  552.  *----------------------------------------------------------------------
  553.  *
  554.  * DevDC7085Activate --
  555.  *
  556.  *    This procedure is invoked in order to "activate" one half of a
  557.  *    DC7085 chip.
  558.  *
  559.  * Results:
  560.  *    None.
  561.  *
  562.  * Side effects:
  563.  *    The channel is re-initialized and the receiver is started.
  564.  *
  565.  *----------------------------------------------------------------------
  566.  */
  567. ENTRY void
  568. DevDC7085Activate(dcPtr)
  569.     register DevDC7085 *dcPtr;        /* Information about the device. */
  570. {
  571.     MASTER_LOCK(&dc7085Mutex);
  572.  
  573.     switch (dcPtr->port) {
  574.     case KBD_PORT:
  575.         if (!(dcPtr->flags & LINE_ACTIVE)) {
  576.         *lprPtr = LPR_RXENAB | LPR_B4800 | LPR_8_BIT_CHAR | KBD_PORT;
  577.         dcPtr->flags |= LINE_ACTIVE;
  578.         }
  579.         break;
  580.     case MODEM_PORT:
  581.     case PRINTER_PORT:
  582.         if (!(dcPtr->flags & LINE_ACTIVE)) {
  583.         *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) | 
  584.                  LPR_8_BIT_CHAR | dcPtr->port;
  585.         dcPtr->flags |= LINE_ACTIVE;
  586.         }
  587.         break;
  588.     }
  589.  
  590.     MASTER_UNLOCK(&dc7085Mutex);
  591. }
  592.  
  593.  
  594. /*
  595.  *----------------------------------------------------------------------
  596.  *
  597.  * DevDC7085RawProc --
  598.  *
  599.  *    This procedure is called back from the Td module as a raw
  600.  *    control procedure.
  601.  *
  602.  * Results:
  603.  *    The return value is the number of bytes returned to the caller
  604.  *    at outBuffer.
  605.  *
  606.  * Side effects:
  607.  *    Depends on the control operation.  Most likely effect is to
  608.  *    start transferring output data.
  609.  *
  610.  *----------------------------------------------------------------------
  611.  */
  612.  
  613. /* ARGSUSED */
  614. ENTRY int
  615. DevDC7085RawProc(dcPtr, operation, inBufSize, inBuffer, outBufSize, outBuffer)
  616.     register DevDC7085 *dcPtr;    /* Our information about device. */
  617.     int operation;        /* What to do:  TD_RAW_OUTPUT_READY etc. */
  618.     int inBufSize;        /* Size of input buffer for operation. */
  619.     char *inBuffer;        /* Input buffer. */
  620.     int outBufSize;        /* Size of output buffer for operation. */
  621.     char *outBuffer;        /* Output buffer. */
  622. {
  623.     int result = 0;
  624.  
  625.     MASTER_LOCK(&dc7085Mutex);
  626.  
  627.     switch (operation) {
  628.     case TD_RAW_START_BREAK:
  629.         breakVal |= 1 << (dcPtr->port + 8);
  630.         *tdrPtr = breakVal;
  631.         break;
  632.  
  633.     case TD_RAW_STOP_BREAK:
  634.         breakVal &= ~(1 << (dcPtr->port + 8));
  635.         *tdrPtr = breakVal;
  636.         break;
  637.  
  638.     case TD_RAW_SET_DTR:
  639.         if (dcPtr->port == MODEM_PORT) {
  640.         *tcrPtr |= TCR_DTR2;
  641.         }
  642.         break;
  643.  
  644.     case TD_RAW_CLEAR_DTR:
  645.         if (dcPtr->port == MODEM_PORT) {
  646.         *tcrPtr &= ~TCR_DTR2;
  647.         }
  648.         break;
  649.  
  650.     case TD_RAW_SHUTDOWN:
  651.         if (dcPtr->flags & LINE_ACTIVE) {
  652.         *lprPtr = dcPtr->port;
  653.         dcPtr->flags &= ~LINE_ACTIVE;
  654.         *tcrPtr &= ~(1 << dcPtr->port);
  655.         }
  656.         break;
  657.  
  658.     case TD_RAW_OUTPUT_READY:
  659.         if (!(dcPtr->flags & XMIT_ENABLED)) {
  660.         *tcrPtr |= 1 << dcPtr->port;
  661.         dcPtr->flags |= XMIT_ENABLED;
  662.         }
  663.         break;
  664.  
  665.     case TD_RAW_FLUSH_OUTPUT:
  666.         while ((*dcPtr->outputProc)(dcPtr->outputData) != -1) {
  667.         /* do nothing */
  668.         }
  669.         break;
  670.  
  671.     case TD_RAW_FLOW_CHARS:
  672.         /* Ignore flow-control chars. */
  673.         break;
  674.  
  675.     case TD_RAW_SET_BAUD_RATE: {
  676.         Td_BaudRate *brPtr;
  677.         int        i;
  678.  
  679.         /*
  680.          * Map the baud rate from an sgttyb constant to an actual
  681.          * number.  Return the value we actually set things to.
  682.          */
  683.  
  684.         brPtr = (Td_BaudRate *) inBuffer;
  685.         for (i = 0; baudMap[i].baud != -1; i++) {
  686.         if (baudMap[i].sgttybVal == brPtr->ospeed) {
  687.             dcPtr->baud = baudMap[i].baud;
  688.             break;
  689.         }
  690.         }
  691.         switch (dcPtr->port) {
  692.         case MODEM_PORT:
  693.             *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) | 
  694.                  LPR_8_BIT_CHAR | MODEM_PORT;
  695.             break;
  696.         case PRINTER_PORT:
  697.             *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) |
  698.                  LPR_8_BIT_CHAR | PRINTER_PORT;
  699.             break;
  700.         }
  701.  
  702.         /*
  703.          * Fall through to next arm of case to return current
  704.          * settings.
  705.          */
  706.     }
  707.  
  708.     case TD_RAW_GET_BAUD_RATE: {
  709.         int i;
  710.         Td_BaudRate *brPtr;
  711.  
  712.         brPtr = (Td_BaudRate *) outBuffer;
  713.         if (outBufSize >= sizeof(Td_BaudRate)) {
  714.         for (i = 0; baudMap[i].baud != -1; i++) {
  715.             if (baudMap[i].baud == dcPtr->baud) {
  716.             brPtr->ispeed = brPtr->ospeed = baudMap[i].sgttybVal;
  717.             result = sizeof(Td_BaudRate);
  718.             }
  719.         }
  720.         }
  721.         break;
  722.     }
  723.     }
  724.     MASTER_UNLOCK(&dc7085Mutex);
  725.     return result;
  726. }
  727.  
  728.  
  729. /*
  730.  *----------------------------------------------------------------------
  731.  *
  732.  * BaudToReg --
  733.  *
  734.  *    Map from a raw baud rate to the value to shove into the register.
  735.  *
  736.  * Results:
  737.  *    The baud value to shove into the register.
  738.  *
  739.  * Side effects:
  740.  *    None.
  741.  *
  742.  *----------------------------------------------------------------------
  743.  */
  744. int
  745. BaudToReg(baud)
  746.     int    baud;
  747. {
  748.     int    i = 0;
  749.  
  750.     while (baudMap[i].baud != baud && baudMap[i].baud != -1) {
  751.     i++;
  752.     }
  753.     return(baudMap[i].regVal);
  754. }
  755.  
  756.  
  757. /*
  758.  * ----------------------------------------------------------------------------
  759.  *
  760.  * DevDC7085MouseInit --
  761.  *
  762.  *    Initialize the mouse.
  763.  *
  764.  * Results:
  765.  *    None.
  766.  *
  767.  * Side effects:
  768.  *    The mouse is initialized.
  769.  *
  770.  * ----------------------------------------------------------------------------
  771.  */
  772. ENTRY void
  773. DevDC7085MouseInit()
  774. {
  775.     MASTER_LOCK(&dc7085Mutex);
  776.  
  777.     *lprPtr = LPR_RXENAB | LPR_B4800 | LPR_OPAR | LPR_PARENB |
  778.                LPR_8_BIT_CHAR | MOUSE_PORT;
  779.  
  780.     MASTER_UNLOCK(&dc7085Mutex);
  781. }
  782.  
  783.  
  784. /*
  785.  * ----------------------------------------------------------------------------
  786.  *
  787.  * DevDC7085MousePutCh --
  788.  *
  789.  *    Write a character to the mouse.  This is only called at initialization
  790.  *    time.
  791.  *
  792.  * Results:
  793.  *    None.
  794.  *
  795.  * Side effects:
  796.  *    A character is written to the mouse.
  797.  *
  798.  * ----------------------------------------------------------------------------
  799.  */
  800. ENTRY void
  801. DevDC7085MousePutCh(c)
  802.     int    c;
  803. {
  804.     register    int    timeout;
  805.     register    int    reg;
  806.  
  807.     MASTER_LOCK(&dc7085Mutex);
  808.  
  809.     reg = *tcrPtr;
  810.     *tcrPtr = 0x2;
  811.     timeout = 60000;
  812.  
  813.     for (timeout = 60000;
  814.      (!(*csrPtr & CSR_TRDY) || (*csrPtr & CSR_TX_LINE_NUM) != 0x100) &&
  815.          timeout > 0;
  816.      timeout--) {
  817.     }
  818.     *tdrPtr = c & 0xff;
  819.     MACH_DELAY(50000);
  820.     *tcrPtr = reg;
  821.  
  822.     MASTER_UNLOCK(&dc7085Mutex);
  823. }
  824.  
  825.  
  826. /*
  827.  * ----------------------------------------------------------------------------
  828.  *
  829.  * DevDC7085MouseGetCh --
  830.  *
  831.  *    Read a character from the mouse.  This is only called at
  832.  *    initialization time.
  833.  *
  834.  * Results:
  835.  *    A character read from the mouse, -1 if we timed out waiting.
  836.  *
  837.  * Side effects:
  838.  *    None.
  839.  *
  840.  * ----------------------------------------------------------------------------
  841.  */
  842. ENTRY int
  843. DevDC7085MouseGetCh()
  844. {
  845.     register int        timeout;
  846.     register unsigned short    c;
  847.  
  848.     MASTER_LOCK(&dc7085Mutex);
  849.  
  850.     for (timeout = 1000000; timeout > 0; timeout--) {
  851.     if (*csrPtr & CSR_RDONE) {
  852.         c = *rBufPtr;
  853.         MACH_DELAY(50000);
  854.         if (((c >> 8) & 03) != 1) {
  855.         continue;
  856.         }
  857.         MASTER_UNLOCK(&dc7085Mutex);
  858.         return(c & 0xff);
  859.     }
  860.     }
  861.     MASTER_UNLOCK(&dc7085Mutex);
  862.  
  863.     return(-1);
  864. }
  865.  
  866.  
  867. /*
  868.  * ----------------------------------------------------------------------------
  869.  *
  870.  * DevDC7085KBDPutc --
  871.  *
  872.  *    Put a character out to the keyboard.
  873.  *
  874.  * Results:
  875.  *    None.
  876.  *
  877.  * Side effects:
  878.  *    A character is written to the keyboard.
  879.  *
  880.  * ----------------------------------------------------------------------------
  881.  */
  882. ENTRY void
  883. DevDC7085KBDPutc(c)
  884.     register int c;
  885. {
  886.     register unsigned    short    tcr;
  887.     register int    timeout;
  888.     int            line;
  889.  
  890.     MASTER_LOCK(&dc7085Mutex);
  891.  
  892.     tcr = *tcrPtr & 1;
  893.     *tcrPtr |= 1;
  894.     while (1) {
  895.         timeout = 1000000;
  896.         while (!(*csrPtr & CSR_TRDY) && timeout > 0) {
  897.             timeout--;
  898.         }
  899.         if (timeout == 0) {
  900.             break;
  901.         }
  902.         line = (*csrPtr >> 8) & 3;
  903.         if (line != 0) {
  904.             tcr |= 1 << line;
  905.             *tcrPtr &= ~(1 << line);
  906.             continue;
  907.         }
  908.         *tdrPtr = breakVal | (c & 0xff);
  909.         MACH_DELAY(5);
  910.         while (1) {
  911.             while (!(*csrPtr & CSR_TRDY)) {
  912.             }
  913.             line = (*csrPtr >> 8) & 3;
  914.             if (line != 0) {
  915.                 tcr |= 1 << line;
  916.                 *tcrPtr &= ~(1 << line);
  917.                 continue;
  918.             }
  919.             break;
  920.         }
  921.         break;
  922.     }
  923.     *tcrPtr &= ~1;
  924.     if (tcr != 0) {
  925.     *tcrPtr |= tcr;
  926.     }
  927.  
  928.     MASTER_UNLOCK(&dc7085Mutex);
  929. }
  930.  
  931.